Skyvern Version Bump
Skyvern-AI/skyvern
Walks through a Skyvern open-source release bump: update the version, rebuild the Python and TypeScript SDKs with Fern, commit, and open a pull request.
AI-assisted pull request review workflow for Azure DevOps Git repositories.
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add JocysCom/FocusLogger --skill pr-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install JocysCom/FocusLogger pr-review --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/JocysCom/FocusLogger.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.ai/skills/pr-review .claude/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .claude/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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/JocysCom/FocusLogger/tree/main/.ai/skills/pr-reviewType 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 JocysCom/FocusLogger --skill pr-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install JocysCom/FocusLogger pr-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JocysCom/FocusLogger.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.ai/skills/pr-review .agents/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .agents/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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 JocysCom/FocusLogger --skill pr-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install JocysCom/FocusLogger pr-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JocysCom/FocusLogger.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.ai/skills/pr-review .cursor/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .cursor/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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/JocysCom/FocusLogger.git --path .ai/skills/pr-review--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 JocysCom/FocusLogger --skill pr-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install JocysCom/FocusLogger pr-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JocysCom/FocusLogger.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.ai/skills/pr-review .gemini/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .gemini/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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 JocysCom/FocusLogger pr-reviewInstalls 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 JocysCom/FocusLogger --skill pr-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/JocysCom/FocusLogger.git skills-src && mkdir -p .github/skills && cp -r skills-src/.ai/skills/pr-review .github/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .github/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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 JocysCom/FocusLogger --skill pr-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install JocysCom/FocusLogger pr-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JocysCom/FocusLogger.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.ai/skills/pr-review .opencode/skills/pr-review && 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-review" agent skill from https://github.com/JocysCom/FocusLogger/tree/main/.ai/skills/pr-review into .opencode/skills/pr-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-review", 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.
pr-reviewAI-assisted pull request review workflow for Azure DevOps Git repositories.
PR Review is an agent skill from JocysCom/FocusLogger. AI-assisted pull request review workflow for Azure DevOps Git repositories. Use when the user asks to review a pull request, perform a PR review, analyse PR changes, or run the PR review pipeline. Provides a complete scripted workflow to fetch PR metadata, prepare a local branch folder, export diffs, generate review reports and checklists, and post review comments back to Azure DevOps. Requires Python 3.9+ and Git.
Its SKILL.md is about 12k tokens, which your agent loads only when the skill is triggered. The skill folder holds 27 other files, including scripts, reference files and assets (for example `assets/checklist.template.md`, `assets/config.template.json` and `assets/pr-description.template.md`).
It sits in Development, covering Pull requests. It works with Azure DevOps, Git and Python. The repository describes itself as: Find out which process or program is taking the window focus. In-game controls could temporary stop responding if other program steals the focus. The licence is GPL-3.0.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit b32c096. 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.
Ships 12 files in scripts/ (Python and PowerShell, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
pythondotnetgitpipazFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, pip and az, 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.
PR Review loads about 12k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 107 tokens; SKILL.md has 5,104 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 patterns that need a careful read before installing.
XTERNAL_FEED_ENDPOINTS` + PAT-injected `.npmrc`; if that didn't happen the env var is missing or the cloned repo referenAutomated 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.
The full file from JocysCom/FocusLogger at commit b32c096, republished under its GPL-3.0 licence (© JocysCom). 5,104 words, ~11,751 tokens.
.claude/skills/pr-review/SKILL.md (or your agent's skills folder). This skill also uses 24 other files; get the full folder from GitHub.Purpose-built standard operating procedures and minimal workspace structure for an AI-assisted PR review workflow targeting Azure DevOps Git repositories using Python as the cross-platform scripting language.
For script invocation guidance, see references/tool-instructions.md.
Objectives
pr-review.json by first calling list_files on the workspace directory before using read_file or asking follow-up questions. This prevents assumptions about its presence.Workspace layout
The repository is organized into the following structure:
.
├── pr-review.json Read-only user configuration (NEVER modified)
├── .ai/
│ └── skills/
│ └── pr-review/
│ ├── SKILL.md This SOP file
│ ├── scripts/ Python workflow scripts
│ │ ├── review_config.py Helper module for merged configuration
│ │ ├── invoke_build.py Cross-platform build wrapper (dotnet msbuild / MSBuild)
│ │ ├── Setup_Util_TrustedRootCertificates_Save.ps1 Windows corporate cert helper
│ │ ├── s01_reset_workspace.py Clean previous review artifacts
│ │ ├── s02_get_azure_devops_info.py Fetch PR and work item metadata
│ │ ├── s03_extract_attachments.py Download images from PR/work-item comments + descriptions
│ │ ├── s04_fetch_repository.py Prepare BranchFolder and fetch branches when PullBranch is true
│ │ ├── s05_reset_templates.py Create review templates with actual PR data
│ │ ├── s06_export_diff_artifacts.py Export per-file diffs and changed files
│ │ ├── s07_consolidate_diffs_and_content.py Consolidate patches and snapshots
│ │ ├── s08_rasterize_images.py Render ```mermaid blocks to PNG (offline, no upload)
│ │ ├── s09_upsert_review_attachments.py Upload diagrams + local images to PR attachments
│ │ ├── s10_upsert_review_comment.py Post review comment to Pull Request
│ │ ├── s11_upsert_pr_description.py Upsert PR description (guarded; refuses to overwrite real content)
│ │ └── s12_upsert_suggestion_threads.py Post suggestion threads to Pull Request
│ ├── assets/ Templates (SSOT)
│ │ ├── review.template.md Template for review.md
│ │ ├── checklist.template.md Template for checklist.md
│ │ └── config.template.json Template for pr-review.json
│ └── references/
│ └── tool-instructions.md Python invocation rules
└── {WorkFolder}/ Configurable via WorkFolder in pr-review.json
├── review.md Consolidated findings and verdict (generated)
├── checklist.md Checklist and scoring rubric (generated)
├── pr-description.md Brief PR description (generated; posted only when original PR description is empty)
├── diagrams/ Optional generated images (when GenerateImages: true)
├── attachments/ Screenshots from PR + work items (written by s02b; see manifest.json)
├── context.json Dynamic Azure DevOps data (written by scripts)
├── meta.json Git repository metadata (written by scripts)
├── changes/ Working tree copies of changed files
├── diffs/ Per-file unified diff patches (path.patch)
├── base/ Optional base versions of changed files
└── branch/ Default local PR branch folder when BranchFolder is not `.`PR configuration and file structure
The configuration system uses three separate files to maintain clean separation between user input, fetched data, and Git metadata:
pr-review.json - Read-only user configuration (root of workspace)
BaseUrl, OrganizationName, ProjectName, and RepoName are parsed from git remote get-url origin for Azure DevOps HTTPS or SSH remotes.BranchName is derived from the current Git branch.TargetBranchName is derived from origin/HEAD and falls back to master.PullRequestId is optional. If omitted, s02_get_azure_devops_info.py finds the active PR whose source branch is the current branch. If none or multiple active PRs are found, the workflow stops with a clear message and asks for PullRequestId.WorkItemIds is optional. If omitted, s02_get_azure_devops_info.py reads linked work items from the PR.AzureApiVersion defaults to 7.1.WorkFolder defaults to .tmp/pr-review.PullBranch defaults to false and BranchFolder defaults to . so reviewing the current branch is the default workflow.BaseUrl, OrganizationName, ProjectName, RepoName - only set these when the Git remote cannot be parsed.PullRequestId - only set this when multiple/no active PRs are found for the current branch.WorkItemIds - only set this when PR work item links are absent or incomplete.BranchName, TargetBranchName - only set these when Git branch/default-branch detection is wrong.PullBranch - set to true only when the scripts should clone/fetch the PR branch into a disposable checkout.BranchFolder - local repository folder for the PR branch; use . to review the current workspace branch, or .tmp/pr-review/branch for a disposable checkout.BranchPath - legacy alias for BranchFolder; prefer BranchFolder for new configurations.GenerateImages - set to true to allow ai-image-generation to produce at most one image per PR when the AI judges a real picture (mockup, before/after, conceptual sketch) would meaningfully help. Default: false. Mermaid diagrams are always allowed regardless of this flag.ReviewAgentUrl - URL of the review agent's home (typically a .ai/skills/pr-review link on the repository hosting the skill); used to expand {review_agent_url} inside ReviewCommentHeader.ReviewCommentHeader - Markdown line(s) prepended below the mandatory [AI Review] tag when n8n posts the review as a PR comment. Supports the {review_agent_url} placeholder.All artifact paths below (context.json, meta.json, review.md, diffs/, etc.) are relative to the configured WorkFolder. BranchFolder is resolved relative to the repository root unless it is absolute.
{WorkFolder}/context.json - Dynamic Azure DevOps data (written by s02_get_azure_devops_info.py)
s02_get_azure_devops_info.pys01_reset_workspace.pyBranchName, TargetBranchName - Branch names from PR or Git-derived defaultsPullRequestId, PullRequestTitle, PullRequestDescription, PullRequestStatusPullRequestCreatedBy, PullRequestCreatedDateWorkItemTitle, WorkItemType, WorkItemState, WorkItemAssignedTo (based on first Work Item)PullRequest - Full PR API response objectWorkItems - Full work item API response objectsWorkItem - First work item object (for backward compatibility){WorkFolder}/meta.json - Git repository metadata (written by s04_fetch_repository.py)
s04_fetch_repository.pys01_reset_workspace.pybaseCommit, featureCommit - Commit SHAstimestamp - When repository was fetchedworkDir - Local repository path resolved from BranchFolderbaseRef, featureRef - Git refs used for diff export (featureRef is HEAD when PullBranch is false)pullBranch - Effective branch-pulling mode used by s04_fetch_repository.pyConfiguration Merging:
Scripts automatically derive Git/Azure DevOps defaults, then merge pr-review.json + {WorkFolder}/context.json using the review_config.py helper module. Context values take precedence over config values, allowing runtime overrides.
Prerequisites
invoke_build.py)pip install -r .ai/skills/pr-review/scripts/requirements.txtrequests and requests-ntlm because the Windows Integrated Authentication fallback uses NTLM helpers when no PAT or Azure CLI token is availableAuthentication methods (scripts try in this order):
AZDO_PAT environment variable with a PAT that has Code (Read) scope. Works on all platforms.az account get-access-token if Azure CLI is installed and authenticated. Cross-platform.Quick start using scripts
Use the Python scripts in the .ai/skills/pr-review/scripts/ directory to prepare the workspace and export diffs and changed files. Scripts are prefixed with execution order (s01, s02, etc.). Run them in the following order:
Run each script as a separate command and wait for it to finish before invoking the next script. Do not chain multiple scripts together on a single command line.
python .ai/skills/pr-review/scripts/s01_reset_workspace.py - Clean previous review artifactspython .ai/skills/pr-review/scripts/s02_get_azure_devops_info.py - Fetch PR and work item metadatapython .ai/skills/pr-review/scripts/s03_extract_attachments.py - Download attached images from PR + linked work items into {WorkFolder}/attachments/python .ai/skills/pr-review/scripts/s04_fetch_repository.py - Prepare the local branch folder; clones/fetches only when PullBranch is truepython .ai/skills/pr-review/scripts/s05_reset_templates.py - Create review templates with actual datapython .ai/skills/pr-review/scripts/s06_export_diff_artifacts.py - Export diffs and changed filespython .ai/skills/pr-review/scripts/s07_consolidate_diffs_and_content.py - Consolidate patches and generate before-and-after content snapshots{WorkFolder}/review.md with findingspython .ai/skills/pr-review/scripts/s08_rasterize_images.py - Render ```mermaid blocks in review.md to PNGs (offline, always safe)python .ai/skills/pr-review/scripts/s09_upsert_review_attachments.py - Upload diagrams + local images to PR; rewrite review.md (skipped when SKIP_POST_COMMENT=1)python .ai/skills/pr-review/scripts/s10_upsert_review_comment.py - Upsert review comment to Pull RequestIf {WorkFolder}/attachments/manifest.json exists with totalCount > 0, the PR (or a linked work item) carries screenshots. For each entry: open imagePath (multimodal), read contextPath (why it was attached). Treat any ai-vision-summary.md inside a workitem-*/ folder as authoritative unless the image contradicts it. Cite findings with the attachment path (e.g. Source: attachments/workitem-238853/img-001-image.png). A screenshot that documents a bug the diff doesn't fix is a Blocker.
After running the scripts above, decide what to load based on your available context window.
python .ai/skills/pr-review/scripts/s07_consolidate_diffs_and_content.py — it prints:Recommended loading strategy:
{WorkFolder}/all-pre-content.txt (before) then {WorkFolder}/all-post-content.txt (after).{WorkFolder}/all-pre-content.txt.part001 → summarize → ...part002 → summarize → ...{WorkFolder}/all-post-content.txt.part001 → summarize → ...{WorkFolder}/all-diffs.txt or its parts instead of pre/post.Use per-file patches under {WorkFolder}/diffs/** or files under {WorkFolder}/changes/** only when you need to zoom into specific files.
Refer to each script's --help for usage details.
Review flow
Think through upcoming steps deliberately and verify instructions (e.g., consult .github/copilot-instructions.md) before executing commands.
Prepare workspace using the quick start scripts. The s01_reset_workspace.py script cleans artifacts, then s02_get_azure_devops_info.py fetches PR data, then s03_extract_attachments.py downloads PR + work-item attachments into {WorkFolder}/attachments/, then s04_fetch_repository.py prepares BranchFolder and writes Git metadata, then s05_reset_templates.py creates {WorkFolder}/review.md and {WorkFolder}/checklist.md from their respective template files with actual PR data.
When PullBranch is false, BranchFolder is treated as the already checked-out PR branch and the head ref is HEAD; set BranchFolder to . to review the current workspace branch.
If present, read .github/copilot-instructions.md from the target repository (BranchFolder) and incorporate any guidance it contains into the review process, such as which projects to test.
Load {WorkFolder}/all-pre-content.txt – full "before" state of all changed files
Load {WorkFolder}/all-post-content.txt – full "after" state of all changed files
Use {WorkFolder}/all-diffs.txt – concise summary of changed lines and statuses
Skim {WorkFolder}/diffs/changed-files.tsv to understand scope.
Read per-file patches under {WorkFolder}/diffs and the corresponding working files under {WorkFolder}/changes.
Restore/build the solution as a best-effort sanity check, not a gate:
.slnx (modern XML format) and .sln (legacy INI format) exist with the same stem, always use the .slnx — it is the source of truth in repositories that have started migrating. invoke_build.py enforces this automatically when given a .sln with a sibling .slnx..slnx / .sln exists at the repo root, use it..csproj/.vbproj/.fsproj).invoke_build.py rather than bare dotnet restore / dotnet build. The wrapper rewrites the recorded project paths in the local clone so they match on-disk casing — necessary for Windows-authored solutions on case-sensitive Linux filesystems (e.g. .sln says Web.Core/Web.Core.csproj but git wrote Web.Core/web.core.csproj). Bare dotnet commands skip that pass and fail with "project not found" on those repos. The rewrites live in the disposable clone and never travel back to origin.python .ai/skills/pr-review/scripts/invoke_build.py {solution|project} /t:Restorepython .ai/skills/pr-review/scripts/invoke_build.py {solution|project} /v:minimal /clp:Summaryinvoke_build.py uses dotnet msbuild cross-platform, with full MSBuild via vswhere on Windows as an optimization for multi-targeting solutionsBuild/test is a best-effort sanity check, NOT a review gate. A code review is still valuable when the local build can't be reproduced. If restore / build / test fails because of any of the following, record exactly what failed in the ## Testing section of review.md (one or two lines, no apology, no retries past three attempts) and continue with the diff-level analysis:
pkgs.dev.azure.com/... without AZDO_PAT wired, npmjs.org/@scope packages, Artifactory, etc.). When AZDO_PAT is set, the container auto-wires Azure DevOps Artifacts auth at clone time via VSS_NUGET_EXTERNAL_FEED_ENDPOINTS + PAT-injected .npmrc; if that didn't happen the env var is missing or the cloned repo references a non-Azure-DevOps feed.api.nuget.org, registry.npmjs.org) — proxy / firewall / TLS-inspection issues. The container's smoke tests at install time validate these endpoints; if they passed at install but fail now, the proxy state changed.~/.dotnet, ~/.nuget, ~/.npm). The container pre-creates these under the agent user's home in container-init.sh and exports DOTNET_CLI_HOME, NUGET_PACKAGES, npm_config_cache so most tools land in writable dirs without configuration. If a tool still hits a write block, redirecting it to /tmp is acceptable for this review run.
Do not pursue project-specific build fixes (renaming a file, editing the slnx, removing a ProjectReference) just to make the build pass — the PR is the source of truth, and a "review" that depends on edits the author hasn't approved is unverifiable.Based on guidance (e.g., copilot-instructions or changed projects), find and run the most directly related automated tests you can identify; widen scope only as risk requires.
{repo_path}/{project_name_path}/{code_path}/{source_name}.{source_ext}{repo_path}/Tests/{project_name_path}.Tests/{code_path}/{source_name}{test_suffix}{code_path} exactly under the test project.{project_name_path} stable and append .Tests.{test_suffix} from the source language or the repo's dominant test framework convention.src, Source, app, or lib, treat that container as outside {project_name_path} and do not mirror it under Tests.{test_suffix} values:Tests.cs.test.ts, .test.tsx, .test.js, or .test.jsx_test.py_test.goTest.java or Test.ktRepo/src/Payments/Calculations/VatCalculator.cs -> Repo/Tests/Payments.Tests/Calculations/VatCalculatorTests.csRepo/web/components/Button.tsx -> Repo/Tests/web.Tests/components/Button.test.tsxCapture findings into {WorkFolder}/review.md by copying the exact structure of assets/review.template.md — do NOT invent sections, rename headings, or reorder. The template is the contract.
MANDATORY section order (top → bottom):
# AI Review report (title, only once){RISK_BADGE} **Risk: {RISK_LEVEL}** — {RISK_REASON}
{CONFIDENCE_BADGE} **Confidence: {CONFIDENCE_LEVEL}** — {CONFIDENCE_REASON}
The two badges use inverted color mappings so 🟢 always means "good": Low Risk = 🟢, High Risk = 🔴; High Confidence = 🟢, Low Confidence = 🔴. Medium on either is 🟡.## Decision — symbol + label + one-line "Why:"## Related — bullets from context.json.WorkItems[] (or - (no linked items))## Blockers — must-fix items, or - (None.)## Suggestions — concrete code blocks, each with severity tag## How it works — plain-English explanation (ALWAYS present; if sparse source material, end with (Inferred from diff; verify intent.))## How to test — copy-pasteable steps (ALWAYS present)## Files to review first — top 3 highest-risk paths<details><summary>Audit details</summary> … </details> — Context, Scope, Strengths, Issues and risks, Testing, Security, Performance, Operations, Documentation, Diff overviewAnti-duplication rule (CRITICAL):
The visible block (sections 2–9) and the audit block (section 10) serve DIFFERENT audiences and must not repeat the same information:
Required content rules:
[AI Review] tag lives in the template's H1 (# [AI Review]). The n8n workflow's marker detection accepts the tag whether it appears alone on a line or inside an H1. Do NOT add a separate [AI Review] line above the H1 — that would render twice in the posted comment.
Fill {RISK_BADGE}, {RISK_LEVEL}, {RISK_REASON}, {CONFIDENCE_BADGE}, {CONFIDENCE_LEVEL}, {CONFIDENCE_REASON}, {DECISION_SYMBOL}, {DECISION_LABEL} using the rubrics under heading 8. Never leave or delete placeholders — the badge emoji MUST be the first character on its line, before the bold label. If you omit the badge the rendered comment is missing its colour-coded severity cue. The two _REASON values are short one-line justifications (≤ ~12 words each) — e.g. Risk: "touches auth and adds a DB migration"; Confidence: "diff understood, tests reviewed, build verified".
## Related lists linked references using each platform's NATIVE auto-link syntax. Do not wrap in markdown links and do not append state, comment counts, or "(title unavailable)" placeholders — those add noise without information, and the platform already shows that data beneath the PR. Native syntax:
#<ItemId> (e.g. #196182)!<PullRequestId> (e.g. !32147)#<Number> (e.g. #123)Optionally append — <Title> only when the title genuinely helps a scanner. If the title is unavailable in context.json, write just the bare reference — never invent one, never write (title unavailable). For external references the platform does NOT auto-link (wiki page, ticket in another system, public docs URL), use a markdown link: [Title](URL). If there are no references, write - (no linked items). Quote a specific comment in "How it works" or audit "Issues and risks" only when it materially shapes the verdict — do not paste full threads.
## How it works and ## How to test are MANDATORY — never omit, even for tiny PRs. For a one-line doc change, How it works = "User-facing wiki text was clarified to define X and Y" (one sentence) and How to test = "Re-render the wiki page; confirm the new sentence appears and renders cleanly" (one step).
Suggestions carry severity tags: 🔴 Blocking / 🟡 Recommended / ⚪ Optional. Reference Suggestion N from Blockers when a concrete fix is offered. Each suggestion's code body must not contain bare triple-backtick fences (they would close the outer \``suggestionblock). If the body needs to show markdown code with backticks, replace the inner fences with~~~` or 4-backtick fences.
Cite sources. Whenever a finding (Suggestion, Blocker, Issues-and-risks bullet, or How-it-works claim) relies on external material — project documentation (e.g., .github/copilot-instructions.md, README.md, SKILL files, wiki pages), an inline source comment, a linked work item, or a public docs URL — include a Source: reference with the path (and line range when applicable) or URL. Findings derived purely from the diff itself need no Source:. This lets the author resolve conflicts by updating either the code or the obsolete reference (e.g., if a developer added a clarifying comment that contradicts the AI suggestion, the citation makes it obvious whether the suggestion or the comment is out of date). Examples: Source: .github/copilot-instructions.md; Source: src/Foo.cs:42-48 (comment); Source: #196182 (work item).
Prefer Mermaid for diagrams. Only invoke ai-image-generation (at most one image per PR) when GenerateImages: true in pr-review.json AND a real picture would meaningfully help.
Audit ## Testing: list related tests found, tests actually run, build / validation evidence, coverage adequacy. If no suitable automated test exists, add a Recommended durable tests: sub-list in the same block.
Also fill in {WorkFolder}/pr-description.md with a brief PR description (Changes / Why). The file starts with a <!-- pr-description:unfilled --> sentinel — you MUST delete that line when you write real content; the n8n workflow's Build Review Comment skips pushing the file to the PR description if the sentinel is still present. Do NOT add a Related section — Azure DevOps and GitHub already render linked work items / issues natively beneath the PR; only mention external references (wiki page, ticket in another system) when they exist. The n8n workflow updates the PR description from this file only when the original PR description is effectively empty (literally empty, whitespace-only, or a documented placeholder like "Please describe your change").
Complete {WorkFolder}/checklist.md following the structure in assets/checklist.template.md and compute the score.
Record verdict and any required follow-ups.
Ask user to review {WorkFolder}/review.md content before posting.
Run python .ai/skills/pr-review/scripts/s08_rasterize_images.py to render Mermaid diagrams in review.md to PNGs (offline, safe to always run).
Run python .ai/skills/pr-review/scripts/s09_upsert_review_attachments.py to upload the PNGs (and any local images the AI embedded) to the PR and rewrite review.md to embed the returned URLs.
Upon user confirmation, run python .ai/skills/pr-review/scripts/s10_upsert_review_comment.py to post review comment to the Pull Request (automatically marked as resolved if approved).
Run python .ai/skills/pr-review/scripts/s11_upsert_pr_description.py to update the PR description from pr-description.md. Refuses to overwrite if the PR already has a real description.
If the review contains suggestions, run python .ai/skills/pr-review/scripts/s12_upsert_suggestion_threads.py to post each suggestion as a dedicated inline PR comment thread with file/line context. Suppressed in n8n/scheduled mode via SKIP_POST_COMMENT=1.
python .ai/skills/pr-review/scripts/s12_upsert_suggestion_threads.py --remove-postedReview checklist
The review checklist template is maintained in assets/checklist.template.md. This is the single source of truth for the checklist structure.
The s05_reset_templates.py script creates {WorkFolder}/checklist.md from the template, replacing placeholders with actual values from the configuration and fetched data.
Template placeholders:
{PR_LINK} - Pull request URL{BASE_BRANCH} - Base branch name{FEATURE_BRANCH} - Feature branch name{REPO_NAME} - Repository name{PROJECT_NAME} - Project name{WORK_ITEM_LINK} - Link(s) to associated work item(s)The checklist includes sections for:
Review report
The review report template is maintained in assets/review.template.md. This is the single source of truth for the report structure.
s05_reset_templates.py creates {WorkFolder}/review.md from the template, replacing static placeholders with values from configuration and fetched data. AI-judged placeholders are filled in by the agent during review.
Template placeholders (static, replaced by s05_reset_templates.py):
{PR_LINK} — Pull request URL{REPO_NAME} — Repository name{PROJECT_NAME} — Project name{BASE_BRANCH} — Base branch name{FEATURE_BRANCH} — Feature branch name{WORK_ITEM_LINK} — Link(s) to associated work item(s)Template placeholders (AI-judged, filled in by the agent):
{RISK_BADGE} — Low ⇒ 🟢, Medium ⇒ 🟡, High ⇒ 🔴{RISK_LEVEL} — Low / Medium / High{RISK_REASON} — short one-line justification (≤ ~12 words){CONFIDENCE_BADGE} — High ⇒ 🟢, Medium ⇒ 🟡, Low ⇒ 🔴 (inverted vs. Risk so 🟢 always means "good"){CONFIDENCE_LEVEL} — High / Medium / Low{CONFIDENCE_REASON} — short one-line justification (≤ ~12 words){DECISION_SYMBOL} — ✅ or ❌{DECISION_LABEL} — Approve / Approve with comments / Request changesVisible block (above the collapsible audit):
{RISK_BADGE} **Risk: {RISK_LEVEL}** — {RISK_REASON}{CONFIDENCE_BADGE} **Confidence: {CONFIDENCE_LEVEL}** — {CONFIDENCE_REASON}#<ItemId>, Azure DevOps pull request !<PullRequestId>, GitHub issue/PR #<Number>). No markdown wrapping, no state, no comment count, no (title unavailable) placeholder — those add noise and the platform already shows that data. Optionally append — <Title> only when the title is in context.json and genuinely helps the scanner. External references that the platform does not auto-link use [Title](URL). Empty list → - (no linked items).(Inferred from diff; verify intent.) when source material is sparse)Audit details (inside <details> block at the bottom):
Decision symbols (canonical, used verbatim — downstream tooling matches on these labels):
| Symbol | Unicode | Label | Meaning |
|---|---|---|---|
| ✅ | U+2705 WHITE HEAVY CHECK MARK | Approve | No blocking issues; merge when ready |
| ✅ | U+2705 WHITE HEAVY CHECK MARK | Approve with comments | No blockers; non-blocking suggestions present |
| ❌ | U+274C CROSS MARK | Request changes | One or more blockers; do not merge until addressed |
The label string is exact and case-sensitive.
Risk-level rubric (AI-judged): badge tracks severity — green is low risk (safe), red is high risk (dangerous).
| Badge | Level | Triggers |
|---|---|---|
| 🟢 | Low | Touches non-critical paths, has tests, no security/perf/data implications |
| 🟡 | Medium | Touches business logic, missing some test coverage, or moderate refactor |
| 🔴 | High | Security, auth, payments, data migrations, breaking changes |
Confidence-level rubric (AI self-assessment): badge tracks certainty — green is high confidence (sure), red is low confidence (unsure). Note the inverted mapping vs. Risk: 🟢 means "good" on both scales but corresponds to different levels (Low Risk ↔ High Confidence).
| Badge | Level | Meaning |
|---|---|---|
| 🟢 | High | Full context available, diff understood, tests reviewed |
| 🟡 | Medium | Some context missing — sparse work item, build failed, etc. |
| 🔴 | Low | Significant unknowns flagged in audit section |
Image generation: off by default. The skill reads GenerateImages from pr-review.json; when true, the AI may invoke the ai-image-generation skill at most once per PR, only when it judges a real picture (mockup, before/after, conceptual sketch) would meaningfully help. Output goes to {WorkFolder}/diagrams/ and is embedded via a Markdown image link inside the "How it works" section. Mermaid is always allowed and is the preferred path for flow / sequence / architecture diagrams.
8a. PR description (auto-generated brief)
`s05_reset_templates.py` also generates `{WorkFolder}/pr-description.md` from `assets/pr-description.template.md`. The AI overwrites it during review with `## Changes` + `## Why` content.
**Unfilled sentinel:** the template opens with `<!-- pr-description:unfilled — agent: remove this line ... -->`. The agent MUST delete that sentinel line when writing real content. The n8n workflow's `Build Review Comment` node skips the PR-description update entirely if the sentinel is still present, so an unfilled scaffold cannot reach the PR.
**Do NOT add a `Related` section.** Azure DevOps shows linked work items, and GitHub shows linked issues/PRs, in the native PR UI already — duplicating them in the description is noise. Only mention references that are *not* already auto-linked by the platform (external wiki page, ticket in another system, public docs link).
The n8n workflow `Refactoring - Review Pull Request` reads this file and updates the actual PR description **only when** (a) the sentinel has been removed AND (b) the original PR description is effectively empty (literally empty, whitespace-only, or one of the documented placeholder patterns). Author content is never overwritten.Script interfaces specification
review_config.py - Helper module for configuration management
Functions:
get_review_config() - Load and merge pr-review.json + {WorkFolder}/context.jsonget_git_repository_root() - Find Git repository root for a pathassert_standalone_git_repository() - Ensure path is a standalone Git repo rootget_workspace_root() - Locate workspace root by walking up to pr-review.jsonget_work_folder() - Resolve artifact output directory from configget_branch_folder() - Resolve the local PR branch repository folder from BranchFolder or legacy BranchPathshould_pull_branch() - Normalize the PullBranch setting to a booleanget_auth_headers() - Build Azure DevOps authentication headers (PAT / Azure CLI / fallback)s02_get_azure_devops_info.py - Fetch PR and work item metadata
Purpose: Query Azure DevOps REST API and populate {WorkFolder}/context.json with dynamic data.
Uses settings from pr-review.json.
s03_extract_attachments.py - Download attached images from PR + linked work items
Purpose: Scan PR and linked work items for image references and download each into {WorkFolder}/attachments/ with a .context.md and .meta.json sidecar. The reviewing AI reads attachments/manifest.json. Deterministic; no AI calls.
s04_fetch_repository.py - Prepare the local branch folder and fetch branches when configured
Purpose: Clone or update BranchFolder and fetch base/feature refs when PullBranch is true; otherwise use BranchFolder as an existing local checkout and compare base against HEAD.
Uses settings from pr-review.json and {WorkFolder}/context.json.
s05_reset_templates.py - Create review templates with actual PR data
Purpose: Create review.md and checklist.md from templates with actual PR data.
Uses settings from pr-review.json and {WorkFolder}/context.json.
s06_export_diff_artifacts.py - Export diffs and changed files
Purpose: Export per-file diffs, patches, and changed files for base..feature comparison.
Uses settings from pr-review.json and {WorkFolder}/context.json.
s07_consolidate_diffs_and_content.py - Consolidate patches and snapshots
Purpose: Concatenate per-file diffs and pre/post snapshots into single artifacts for the reviewing AI, with chunked output for large PRs.
s01_reset_workspace.py - Clean previous review artifacts
Purpose: Remove generated artifacts from previous review to prepare for new review.
Parameters:
--keep-repo - Keep repository checkout in BranchFolder when it is under {WorkFolder} (faster for same repo)s08_rasterize_images.py - Render ```mermaid blocks in review.md to PNGs
Purpose: Detect ```mermaid fenced blocks in review.md and render each to {WorkFolder}/diagrams/diagram-NNN-<sha>.png using mmdc (mermaid-cli). Writes mermaid-manifest.json linking each block to its PNG. Offline — no network or PR API calls — so safe to run unconditionally even when SKIP_POST_COMMENT=1. Idempotent on content sha256. No-op (with warning) when mmdc is not installed.
Parameters:
--scale N - mmdc render scale (default: 2)--background-color COLOR - mmdc background color (default: white)--mmdc PATH - Explicit path to mmdc binarys09_upsert_review_attachments.py - Upload diagrams + local images to PR; rewrite review.md
Purpose: For Azure DevOps PRs, upload each PNG produced by s08 to the PR's attachments endpoint and substitute ```mermaid fences in review.md with  (collapsed source kept in <details>). Also uploads any  references the AI embedded (e.g. ai-image-generation output) and substitutes their URLs. Skipped on GitHub (which renders mermaid natively).
This script POSTs to the PR's attachments endpoint and must not run when SKIP_POST_COMMENT=1 — entrypoint.sh gates it the same way as s10/s11.
Parameters:
--dry-run - Print actions without uploading or rewritings10_upsert_review_comment.py - Upsert review comment to Pull Request
Purpose: Post the content of {WorkFolder}/review.md as a comment thread on the PR.
Uses settings from pr-review.json and {WorkFolder}/context.json.
Parameters:
--dry-run - Print payload without postings11_upsert_pr_description.py - Upsert PR description from pr-description.md
Purpose: Update the PR description from {WorkFolder}/pr-description.md ONLY when all four guards pass — file is non-empty, no <!-- pr-description:unfilled --> sentinel, no scaffold-signature phrases (Briefly list what changed, One-line motivation, {WORK_ITEM_LINK}), AND the PR's current description is literally empty. Refuses to overwrite real author content (institutional memory: the n8n equivalent once wiped a real description on PR 32147 when its guards were too loose).
Parameters:
--dry-run - Evaluate guards and print decision without PATCHings12_upsert_suggestion_threads.py - Upsert suggestion threads to Pull Request
Purpose: Post suggestions as dedicated inline PR comment threads.
Uses settings from pr-review.json and {WorkFolder}/context.json.
Parameters:
--remove-posted - Remove previously posted suggestion threads--dry-run - Print payloads without postinginvoke_build.py - Build solutions or projects
Purpose: Cross-platform build wrapper. Uses dotnet msbuild (all platforms) or full MSBuild via vswhere (Windows with Visual Studio).
Parameters:
Behaviours worth knowing:
.slnx over .sln when both exist with the same stem; the wrapper auto-substitutes.ProjectReference or solution-listed project whose casing doesn't match the on-disk file (e.g. Web.Core/Web.Core.csproj -> Web.Core/web.core.csproj). Rewrites are line-based string substitution against the matched span; no XML/INI reflow, BOMs preserved. The rewrites live in the disposable clone only and never reach a commit.Examples:
python .ai/skills/pr-review/scripts/invoke_build.py {solution|project} /v:minimal /clp:Summary
python .ai/skills/pr-review/scripts/invoke_build.py MyApp.slnx /p:Configuration=Release /t:RebuildPython guidance
python script.py from the repository root.--help for usage information.pathlib.Path for cross-platform path handling.Setup_Util_TrustedRootCertificates_Save.ps1 is automatically invoked on Windows by API scripts for corporate certificate environments using a direct powershell -File invocation.Mermaid overview
flowchart TD
A[Start] --> B[Setup workspace dirs]
B --> C{PullBranch?}
C -->|true| D[Clone/update BranchFolder and fetch base and feature]
C -->|false| E[Use current BranchFolder HEAD]
D --> F[List changed files]
E --> F
F --> G[Export diffs]
F --> H[Export changed files]
G --> I[Review diffs and files]
H --> I
I --> J[Complete checklist]
J --> K[Record verdict]Quality bar for approvals
Known edge cases
Maintenance
© JocysCom, GPL-3.0. 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 24 other files (scripts, references, assets) in .ai/skills/pr-review of JocysCom/FocusLogger.
Open the folder on GitHubat commit b32c096
PR Review 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 Review this skillJocysCom/FocusLogger | 213 | — | ~12k | Automated safety check: Warn | GPL-3.0 | |
| Skyvern Version BumpSkyvern-AI/skyvern | 23k | — | ~1k | Automated safety check: Notes | AGPL-3.0 | |
| pybind11 Release Preparationpybind/pybind11 | 18k | — | ~1.7k | Automated safety check: Pass | Custom licence | |
| Adk Gitgoogle/adk-python | 22k | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Adk Setupgoogle/adk-python | 22k | — | ~993 | Automated safety check: Notes | Apache-2.0 | |
| GitHub Fork and PR Submissionjxxghp/MoviePilot | 12k | — | ~1.1k | Automated safety check: Notes | GPL-3.0 |
Skyvern-AI/skyvern
Walks through a Skyvern open-source release bump: update the version, rebuild the Python and TypeScript SDKs with Fern, commit, and open a pull request.
pybind/pybind11
Opens the pybind11 release-preparation pull request: picking the release base, bumping the version in common.h and integrating the changelog, following docs/release.rst.
google/adk-python
Writes commit messages and pull request descriptions for the adk-python repository: Conventional Commits types and scopes, subject lines that say why a change was made, and the linked-issue and…
google/adk-python
Sets up a local ADK Python development environment in a git clone of the open-source adk-python repository: a uv virtual environment, all dependency extras, pre-commit hooks, and a first unit-test…
jxxghp/MoviePilot
Submits code changes as a GitHub pull request through an isolated Git clone, reusing or creating your fork and pushing only after you confirm the real diff.
lucasvieirasilva/nx-plugins
Generates a GitHub Pull Request description for this repository from the commits on the current branch, filling in .github/PULLREQUESTTEMPLATE.md (Current Behavior / Expected Behavior / Related…
JocysCom/FocusLogger
Update, create, improve, and synchronise this repository's AI agent instructions and related assets (including skills).
JocysCom/FocusLogger
Create and maintain automated tests in Microsoft-native/.NET projects with a minimal stack — MSTest runner, System.Windows.Automation for Windows desktop, Playwright for real browser smoke.
JocysCom/FocusLogger
Establish and enforce deterministic path patterns across Code ↔ UI route/menu ↔ Test for any project.
JocysCom/FocusLogger
Rasterize specific mermaid blocks inside a markdown file into PNG images.
JocysCom/FocusLogger
Gather, improve, and curate repository documentation and wiki content.
JocysCom/FocusLogger
Generate or refresh .ai/repository-analysis.instructions.md whenever the user needs a repository-wide map of architecture, projects, technology stack, developer workflows, CI/testing, documentation…
Works with
Categories
AI-assisted pull request review workflow for Azure DevOps Git repositories. PR Review is an agent skill from JocysCom/FocusLogger. AI-assisted pull request review workflow for Azure DevOps Git repositories.
PR Review fits situations like: the user asks to review a pull request; perform a PR review; analyse PR changes; run the PR review pipeline.
Run `npx skills add JocysCom/FocusLogger --skill pr-review -a claude-code`. Or copy the skill folder (.ai/skills/pr-review in JocysCom/FocusLogger) into .claude/skills/pr-review in your project. Claude Code loads it when a task matches its description.
Run `npx skills add JocysCom/FocusLogger --skill pr-review -a codex`. Or copy the skill folder (.ai/skills/pr-review in JocysCom/FocusLogger) into .agents/skills/pr-review 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 JocysCom/FocusLogger --skill pr-review -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-review, .gemini/skills/pr-review, .github/skills/pr-review and .opencode/skills/pr-review in your project.
Going by SKILL.md and its folder, PR Review needs Python and PowerShell for the scripts in its folder and the command-line tools its instructions call (python, dotnet, git, pip and az). Our summary lists: Python 3; PowerShell.
SKILL.md contains no URLs. Its commands use git and pip, 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 flagged 1 warning(s): mentions a credentials file (ssh keys, cloud or package-manager tokens). Read the flagged lines before installing; the check is not a guarantee either way. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
PR Review is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 12k tokens (SKILL.md is roughly 47k 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 312 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with PR Review: Skyvern Version Bump (Skyvern-AI/skyvern, 23k stars), pybind11 Release Preparation (pybind/pybind11, 18k stars), Adk Git (google/adk-python, 22k stars) and Adk Setup (google/adk-python, 22k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
JocysCom (a GitHub organization) maintains it in JocysCom/FocusLogger, which has 213 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on June 30, 2026.
Source: JocysCom/FocusLogger on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.